'use strict';
/**
 * Vui365 类库（For Uniapp Without Components）
 * @version 1.0.2-beta.220425
 */

/**
 * 全局配置信息
 */
class EsConfig {
	// 注意：ES6明确规定，Class内部只有静态方法，没有静态属性。所以要把静态属性改为静态方法。ES7 才支持静态属性，可用 babel 编译。
	// 版本信息
	static version = '1.0.0';
	// 全局环境 dev=开发环境&prod=生产环境&testing=测试环境
	static env = "dev";
	// 推广渠道标识（aitui uc wap mbt）
	static channelName = "";
	// 应用市场标识 wxmp=微信小程序&app=应用APP&h5=H5应用&huawei,xiaomi,vivo,oppo
	static appMarket = "h5";
	// 登录接口提供商 weixin=App微信登录&wxmp=微信小程序登录&mobile=手机号登录&test=模拟测试登录
	static loginProvider = "mobile";
	// 是否微信小程序环境
	static isEnvOfWeixinMP = false;
	// 是否 APP 环境（HTML5 Plus）
	static isEnvOfPlus = false;
	// 是否 H5 环境
	static isEnvOfH5 = true;
	// 是否显示电池占位区（微信小程序不用，APP和H5需要）
	static showTopStatusBar = true;
	// 登录会话缓存名称
	static loginSessName = "sessinfo"; // token
	// 开发服务器域名（用于在线图片）
	// static domain = "http://yxcyjl.lh/";
	static domain = "https://cyjl.dev.eme.cn/";
	// 开发服务器接口地址
	// static apiBaseUrl = "http://yxcyjl.lh/index.php/api/";
	static apiBaseUrl = "https://cyjl.dev.eme.cn/api.php/api/";
	// 默认头像图标
	static defaultAvatarIcon = "/static/logo.png";
	// 支付宝支付名称 alipay=支付宝App支付&alipayh5=支付宝H5支付
	static payNameOfAlipay = "alipayh5";
	// 微信支付名称 wxpay=微信App支付&wxpaymp=微信小程序支付&wxpayh5=微信H5支付
	static payNameOfWxpay = "wxpayh5";
	// 支付间隔时间
	static payInterval = 10;
	// 短信发送间隔时间（秒）
	static smsInterval = 30;
	// 短信测试验证码（超级验证码）
	static smsTestingCaptcha = "0609";
	// 是否使用模拟数据（Mock.js）
	static isMockData = false;
	// http请求超时时间（毫秒）
	static httpTimeout = 60000;

	/**
	 * 设置资源URL地址（切换本地路径为远程路径）
	 * @example setResourceUrl('/uploads/2021/1119/d3974335bb7fc1ebe065f3c5c0dfa84f.png')
	 * @example setResourceUrl('/static/h5app/images/icon.png')
	 */
	static setResourceUrl(path) {
		if (!path) {
			return '';
		}
		if (path.indexOf("/static/" == 0)) {
			// return path;
		}
		return path.indexOf('http') == 0 ? path : (EsConfig.domain + path);
	}

	/**
	 * 返回可用的头像地址
	 */
	static getAvatarImage(path) {
		if (!path || path.trim().length == 0) {
			return EsConfig.defaultAvatarIcon;
		}
		return EsConfig.setResourceUrl(path);
	}
}

/**
 * 通用工具类
 * @version 1.0.0
 * @method stdMessage(success, message, data = '', code = 0) 返回标准消息对象
 * @method random(min, max=0) 生成随机数
 */
class EsUtils {

	/**
	 * 返回标准消息对象
	 * @param {Boolean} success 是否成功
	 * @param {String} message 消息内容
	 * @param {Object} data 数据内容
	 * @param {Number} code 状态码 200=成功,401=未授权(未登录),403=禁止访问,500=服务器错误
	 * @see https://tool.lu/httpcode/
	 */
	static stdMessage(success, message, data = '', code = 0) {
		return {
			success: success,
			message: message,
			data: data,
			code: code,
		}
	}
	/**
	 * 生成随机数
	 * @example random(1,10) 生成 1...10之间的随机数（包括1和10）。random(10) 生成 0...10 之间的随机数
	 */
	static random(min, max = 0) {
		if (max == 0) {
			max = min;
			min = 0;
		}
		return Math.round(Math.random() * (max - min)) + min;
	}

	/**
	 * 返回数组中一个或多个随机的键
	 */
	static arrayRandom(array, number = 1) {
		let idx = Math.floor((Math.random() * array.length));
		let data = [],
			array2 = [...array];
		// splice() 方法会改变原始数组
		for (let i = 0; i < number; i++) {
			data.push(array2.splice(idx, 1)[0]);
		}
		return number == 1 ? data[0] : data;
	}

	/**
	 * 将数组打乱
	 * 注意：此方法会改变原始数组！
	 */
	static arrayShuffle(array) {
		// sort() 方法会改变原始数组！
		array.sort(() => {
			return Math.random() > 0.5 ? -1 : 1;
		})
		return array;
	}

	/**
	 * 复制数组
	 */
	static arrayCopy(arr, result) {
		result = result || [];
		for (var i = 0; i < arr.length; i++) {
			if (arr[i] instanceof Array) {
				result[i] = [];
				EsUtils.arrayCopy(arr[i], result[i]);
			} else {
				result[i] = arr[i];
			}
		}
		return result;
	}
	/**
	 * 安全的把字符串转换为数组
	 */
	static split(text, splitor = ',') {
		return text == null || text == undefined ? [] : text.split(splitor);
	}
	/**
	 * 缩减字符串
	 */
	static shortText(text, len = 6) {
		return (text && text.length > len) ? text.substring(0, len) : text
	}
	/**
	 * 字节单位转换
	 */
	static bytesToSize(size) {
		if (bytes === 0) {
			return '0 B';
		}
		var k = 1024, // or 1024
			sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
			i = Math.floor(Math.log(bytes) / Math.log(k));

		return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];
	}
	/**
	 * 数字单位
	 */
	static numberUnit(num = 0) {
		if (!num) {
			return 0;
		}
		num = parseInt(num);
		if (num > 10000) {
			return Math.round(num / 1000) + '万';
		}
		return num;
	}
	/**
	 * 数值限制
	 */
	static numberLimit(value, min = 0, max = 10) {
		if (isNaN(value)) {
			return min;
		}
		value = Number(value)
		if (value < min) {
			return min;
		}
		if (value > max) {
			return max;
		}
		return value;
	}
	// 对Date的扩展，将 Date 转化为指定格式的String 
	// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符， 
	// 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字) 
	// 例子： 
	// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423 
	// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18 
	static timeFormat(fmt, text = null) {
		let date = text ? new Date(text) : new Date();
		//author: meizz 
		let o = {
			"M+": date.getMonth() + 1, //月份 
			"d+": date.getDate(), //日 
			"h+": date.getHours(), //小时 
			"m+": date.getMinutes(), //分 
			"s+": date.getSeconds(), //秒 
			"q+": Math.floor((date.getMonth() + 3) / 3), //季度 
			"S": date.getMilliseconds() //毫秒 
		};
		if (/(y+)/.test(fmt)) {
			fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
		}
		for (let k in o)
			if (new RegExp("(" + k + ")").test(fmt)) {
				fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k])
					.length)));
			}
		return fmt;
	}
	// 获取浏览器参数
	static getQueryString(name, defval = null, url = '') {
		if (!url) {
			url = window.location.search;
		}
		if (!url) {
			return defval;
		}
		// ?id=1&image=awesome.jpg
		var params = url.substring(url.indexOf('?') + 1).split('&'),
			pair = [];
		for (let param of params) {
			pair = param.split('=');
			if (pair[0] == name) {
				// return pair[1];
				return decodeURIComponent(pair[1]);
			}
		}
		return defval;
	}
	// 获取cookie参数
	static getCookie(name, defval = null, cookie = '') {
		if (!cookie) {
			cookie = document.cookie;
		}
		if (!cookie) {
			return defval;
		}
		// cookie1=value; cookie2=value; cookie3=value;
		var params = cookie.split(';'),
			pair = [];
		for (let param of params) {
			pair = param.split('=');
			if (pair[0].trim() == name) {
				return pair[1];
			}
		}
		return defval;
	}
	/**
	 * 复制到剪贴板
	 */
	static copyText(text) {
		let input = document.createElement('input');
		input.value = text;
		document.body.appendChild(input);
		input.select();
		document.execCommand('copy');
		document.body.removeChild(input);
	}
	/**
	 * 比较版本号
	 */
	static compareVersion(v1, v2) {
		v1 = v1.split('.')
		v2 = v2.split('.')
		const len = Math.max(v1.length, v2.length)

		// 调整两个版本号位数相同
		while (v1.length < len) {
			v1.push('0')
		}
		while (v2.length < len) {
			v2.push('0')
		}

		// 循环判断每位数的大小
		for (let i = 0; i < len; i++) {
			const num1 = parseInt(v1[i])
			const num2 = parseInt(v2[i])

			if (num1 > num2) {
				return 1
			} else if (num1 < num2) {
				return -1
			}
		}
		return 0
	}
}

/**
 * 用户登录信息公共类
 */
class LoginState {
	/**
	 * 保存登录会话信息
	 */
	static setLoginInfo(data) {
		uni.setStorageSync(EsConfig.loginSessName, data);

	}
	/**
	 * 获取登录会话信息
	 */
	static getLoginInfo() {
		return uni.getStorageSync(EsConfig.loginSessName);
	}
	/**
	 * 清除登录会话信息
	 */
	static clearLoginInfo() {
		uni.removeStorageSync(EsConfig.loginSessName);
	}
	/**
	 * 判断登录状态
	 */
	static isLogin() {
		let data = LoginState.getLoginInfo();
		return data ? true : false;
	}
	/**
	 * 从服务器获取用户资料（需要在main.js中重写方法）
	 */
	static getUserProfile() {
		// if (!LoginState.isLogin()) {
		// 	return {
		// 		id: 0
		// 	};
		// }
		// let userInfo = LoginState.getLoginInfo();
		// const ret = await stdAjax('/users/' + userInfo.id);
		// console.log('[main.js] LoginState.getUserProfile 服务器返回ret=', ret);
		// if (!ret.success) {
		// 	uni.showToast({
		// 		title: ret.message,
		// 		icon: 'none'
		// 	})
		// 	return {
		// 		id: 0
		// 	};
		// }
		// return ret.data;
	}
}

/**
 * 通用分页接口
// 初始化数据
async initData(){
	this.loadMainData();
	this.papiOfMain = new this.PagingApi(1, 10, UrlCfg.listOfGoods, {
		search_text: ""
	});
	this.listOfGoods = [];
	this.loadMoreList();
},
// 加载分页数据
async loadMoreList() {
	const msgInfo = await this.papiOfMain.nextPage();
	console.log('分页数据：',this.papiOfMain.getOption().page, msgInfo);
	if (!msgInfo.success) {
		console.log('分页数据错误：', msgInfo.message);
		return;
	}
	this.listOfGoods =this.listOfGoods.concat(msgInfo.data);
},
 */
class PagingApi {
	_option = {
		startPage: 0, // 起始页码
		page: 0, // 当前页码
		pageSize: 10, // 分页大小
		pageCount: 0, // 分页数量
		total: 0, // 总行数
		loadedRows: 0, // 已加载的记录行数
		url: "",
		method: "GET",
		param: {},
	}
	constructor(pageId, pageSize, url, param = {}, method = "GET") {
		this._option.url = url;
		this._option.param = param;
		this._option.method = method;
		this._option.startPage = pageId;
		this._option.page = pageId;
		this._option.pageSize = pageSize;
		console.log("[通用分页接口]", this._option)
	}
	reset(param = null) {
		if (param) {
			this._option.param = param;
		}
		this._option.page = this._option.startPage;
		this._option.loadedRows = 0;
	}
	getOption() {
		return this._option;
	}
	setTotal(total) {
		this._option.total = total;
		let pageSize = this._option.pageSize;
		if (total > 0 && pageSize > 0) {
			this._option.pageCount = Math.ceil(total / pageSize);
		}
	}
	/**
	 * 返回列表数据
	 */
	async getList() {
		let param = this._option.param;
		param.page = this._option.page;
		param.page_size = this._option.pageSize;
		return await stdAjax(this._option.url, param, this._option.method);
	}
	async nextPage() {
		if (this._option.loadedRows > 0) {
			if (this._option.pageCount == 0) {
				return EsUtils.stdMessage(false, "没有数据");
			}
			if (this._option.page == this._option.pageCount) {
				return EsUtils.stdMessage(false, "已经是最后一页了");
			}
		}
		if (this._option.pageCount > 0 && this._option.pageCount > this._option.page) {
			this._option.page++;
		}
		const msgInfo = await this.getList();
		if (!msgInfo.success) {
			return msgInfo;
		}
		this._option.loadedRows += msgInfo.data.data.length;
		this.setTotal(msgInfo.data.total);
		return EsUtils.stdMessage(true, "", msgInfo.data.data);
	}
	async prevPage() {
		if (this._option.loadedRows > 0) {
			if (this._option.pageCount == 0) {
				return EsUtils.stdMessage(false, "没有数据");
			}
			if (this._option.page <= 1) {
				return EsUtils.stdMessage(false, "已经是第一页了");
			}
		}
		if (this._option.page > 1) {
			this._option.page--;
		}
		this._option.loadedRows += msgInfo.data.data.length;
		this.setTotal(msgInfo.data.total);
		return EsUtils.stdMessage(true, "", msgInfo.data.data);
	}
}

/**
 * 本地缓存数据库管理器
 */
class StorageManager {
	storeName = 'test';
	maxQuantity = 10;
	constructor(name, maxQuantity = 10) {
		this.storeName = name;
		this.maxQuantity = maxQuantity;
	}
	loadData() {
		// 搜索历史
		let dataStr = uni.getStorageSync(this.storeName);
		return dataStr ? JSON.parse(dataStr) : [];
	}
	addData(item) {
		let list = this.loadData();
		list.unshift(item);
		if (list.length > 6) {
			list.splice(5)
		}
		uni.setStorageSync(this.storeName, JSON.stringify(list));
		return list;
	}
}

/**
 * 模拟数据
 * 支持变量：
 * @i() 循环列表的自动编号
 * @ctitle(length:10) 中文标题
 * @cword(count:1) 中文单词
 * @title(length:50) 英文标题
 * @word(count:1,type:'') 英文单词，type类型包括：ice=数字+中文+英文
 * @image('100x200','@color',alt:'小甜甜')
 * @rand(30,50) 随机范围数
 * @rand(['a','1']) 随机元素
 * @randBool() 随机布尔值
 * @date() 日期
 * @color() 颜色
 * @email() 邮件地址
 * @ip() IP地址
 * @url() URL地址
 * @zip() 邮编
 * @country() 国家
 * @province() 省份
 * @city() 城市
 * @area() 地区
 * @address() 地址
 * @guid() GUID
 * @id() ID
 */
class Mock {
	enable = true
	constructor(enable = true) {
		this.enable = enable;
	}
	mock(template, count = 1) {
		if (count <= 1) {
			return this.mockOne(template);
		}
		let data = [];
		while (count > 0) {
			data.push(this.mockOne(template));
			count--;
		}
		return data;
	}
	mockOne(template) {
		if (typeof (template) == 'string') {
			return template;
		}
		return template;
	}
	parseTemplate(template) {

	}
	parseVar(key) {
		switch (key) {
			case 'image':
				return 'https://img13.360buyimg.com/n7/jfs/t1/62886/17/14787/137438/5dc3bef4E70bd2530/c735d752effa1797.jpg';
			case 'title':
				return '鲁花 食用油 非转基因 物理压榨 玉米油6.18L 新老包装随机发放';
			default:
				return '';
		}
	}
}

/**
 * 发起Ajax请求并返回标准消息格式的数据
 * 支持：stdAjax(url, data, method) 或 stdAjax(url, method) 或 stdAjax({url:'',data:{},method:''})
 */
async function stdAjax(url, data = null, method = 'GET') {
	if (typeof (url) == 'object') {
		// stdAjax({url:'',data:{},method:''})
		method = url.method || 'GET';
		data = url.data || null;
		url = url.url;
	}
	if (typeof (data) == 'string') {
		// stdAjax(url, method)
		method = data;
	}
	if (url.indexOf('http') != 0) {
		url = EsConfig.apiBaseUrl + url.replace(/^\/+/, '');
	}
	let token = uni.getStorageSync('authtoken') || '';

	// #ifndef VUE3
	const [err, result] = await uni.request({
		url: url,
		method: method,
		data: data,
		header: {
			'Authorization': token
		}
	})
	if (err) { // null
		return {
			status: 0,
			message: '网络错误：' + err.message,
			data: null,
			code: 400,
		}
	}
	return result.data;
	// #endif

	// #ifdef VUE3
	try {
		const result = await uni.request({
			url: url,
			method: method,
			data: data,
			header: {
				'Authorization': token
			}
		})
		return result.data;
	} catch (err) {
		return {
			status: 0,
			message: '网络错误：' + err.message,
			data: null,
			code: 400,
		}
	}
	// #endif
}

/**
 * 发送短信验证码
 * @param {string} mobile
 * @param {string} event 事件类型，如：update_mobile
 */
async function sendSMS(mobile, event, isDebug = 0, userId = 0) {
	if (mobile.length != 11) {
		uni.showToast({
			icon: 'none',
			title: '手机号码无效'
		})
		return;
	}
	let formData = {
		mobile: mobile,
		event: event,
		isDebug: 1,
		user_id: userId,
	};
	const ret = await stdAjax('api/sms/send', 'POST', formData);
	console.log('[EsAjax.sendSMS()] 发送短信验证码 data=', formData, ' reg=', ret)
	uni.showToast({
		title: '发送成功'
	})
}

// ESM （ES6 模块导出）
export {
	EsConfig,
	EsUtils,
	LoginState,
	PagingApi,
	StorageManager,
	Mock,
	stdAjax,
	sendSMS,
};

// UMD 模块导出
// return {
//     EsConfig,
//     EsUtils,
//     stdAjax,
// };
